#pragma once

class KeyboardData
{
	/// <Summary> The key </Summary>
	unsigned short key;

	/// <Summary> The windows message </Summary>
	unsigned int message;

	/// <Summary> The previous window message </Summary>
	unsigned int prevMessage;

public:

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Default constructor </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	KeyboardData() : key(0), message(0), prevMessage(0) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Constructor </Summary>
	///
	/// <Param name="_key">	   	The key </Param>
	/// <Param name="_message">	The message </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	KeyboardData(unsigned short _key, unsigned int _message)
		: key(_key), message(_message), prevMessage(0) { }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Constructor </Summary>
	///
	/// <Param name="rawKeyboard">	The raw keyboard data </Param>
	/// <Param name="prev">		  	The previous keyboard </Param>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	KeyboardData(const RAWKEYBOARD &rawKeyboard, const KeyboardData& prev)
	{
		key = rawKeyboard.VKey;
		message = rawKeyboard.Message;
		prevMessage = prev.message;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Resets the message </Summary>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	void ResetMessage()
	{
		prevMessage = message;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Less-than comparison operator </Summary>
	///
	/// <Param name="ref">	The keyboard on the right side </Param>
	///
	/// <Return>	True if the first parameter is less than the second </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool operator<(const KeyboardData &ref) const
	{
		if(key == ref.key)
			return message < ref.message;
		return key < ref.key;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Greater-than comparison operator </Summary>
	///
	/// <Param name="ref">	The keyboard on the right side </Param>
	///
	/// <Return>	True if the first parameter is greater than to the second </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool operator>(const KeyboardData &ref) const
	{
		if(key == ref.key)
			return message > ref.message;
		return key > ref.key;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Equality operator </Summary>
	///
	/// <Param name="ref">	The keyboard on the right side </Param>
	///
	/// <Return>	True if the parameters are considered equivalent </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool operator==(const KeyboardData &ref) const
	{
		return key == ref.key && message == ref.message;
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Non-Equality operator </Summary>
	///
	/// <Param name="ref">	The keyboard on the right side </Param>
	///
	/// <Return>	True if the parameters are not considered equivalent </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool operator!=(const KeyboardData &ref) const
	{
		return !(key == ref.key && message == ref.message);
	}

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Query if this object has a key down message </Summary>
	///
	/// <Return>	True if the message is WM_KEYDOWN, false if not. </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool IsKeyDownEvent() const { return message == WM_KEYDOWN; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Query if this object has a key up message </Summary>
	///
	/// <Return>	True if the message is WM_KEYUP, false if not. </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	bool IsKeyUpEvent() const { return message == WM_KEYUP; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the key </Summary>
	///
	/// <Return>	The key </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	unsigned short GetKey() const { return key; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the message </Summary>
	///
	/// <Return>	The message </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	unsigned int GetMessage() const { return message; }

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <Summary>	Gets the previous message </Summary>
	///
	/// <Return>	The previous message </Return>
	////////////////////////////////////////////////////////////////////////////////////////////////////
	unsigned int GetPrevMessage() const { return prevMessage; }
};